import axios from 'axios'
import JSONbig from 'json-bigint'
import store from '../store/index'
import {Toast} from 'vant'
const request= axios.create({
  baseURL: 'http://www.liulongbin.top:8000/',
  transformResponse: [function (data) {
    try {
      return JSONbig.parse(data)
    } catch (error) {
      return data
    }
   }]
})
const refreshTokenReq = axios.create({
  baseURL: 'http://www.liulongbin.top:8000/'
})
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // console.log(config)
  // 如果有用户信息 就给接口请求加上header的Authorization
  const { user } = store.state
  if (user) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response;
}, async function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  const {status} = error.response
  if(status===401){
    // 未授权  token无效  token过期
    const {user} =store.state
    if(!user||!user.token){
      redirectLogin()
    }
    try {
      const {data}=await refreshTokenReq({
        url:'/app/v1_0/authorizations',
        method:'PUT',
        headers:{
          Authorization: `Bearer ${user.refresh_token}`
        }
      })
      user.token=data.data.token
      store.commit('setUser',user)
      // 把失败的请求继续发出去
      // 走原先的请求拦截器  会拿到 这个配置对象   然后就行了 会重新请求 获取数据  这步重要
      return request(error.config)
    } catch (error) {
      // 刷新token失败  去登录界面
      redirectLogin()
    }
  }else if(status===403){
    // 没有权限
    Toast.fail({
      message:'没有权限',
      forbidClick:true
    })
  }else if(status===404){
    // 资源不存在
    Toast.fail({
      message:'资源不存在',
      forbidClick:true
    })
  }else if(status>=500){
    // 服务端异常
    Toast.fail({
      message:'服务端异常',
      forbidClick:true
    })
  }
  return Promise.reject(error);
});
function redirectLogin(){
  router.replace({
    name:'login',
    query:{
      redirect: router.currentRouter.fullPath
    }
  })
}
export default request
